﻿#include "audioFilter.h"

// 本 demo 演示如何使用 AudioFilter 对 PCM 文件做自定义滤镜处理（如均衡、重采样等）

int main(int argc, char **argv)
{
    printf("start\n");
    AudioFilter objAudioFilter;

    // 输入参数
    int samplerate = 8000;  // 输入采样率
    int channels = 1;       // 输入声道数
    int bitsPerSample = 16; // 输入采样精度（位深）
    int nb_samples = 1024;  // 每帧采样点数

    // 计算每帧字节数
    int bytes_per_sample = bitsPerSample / 8;
    int pcm_frame_size = nb_samples * channels * bytes_per_sample;

    // 输出参数（可根据滤镜链实际输出格式调整）
    int out_samplerate = 8000;
    int out_channels = 1;
    int out_bitsPerSample = 16;
    int out_bytes_per_sample = out_bitsPerSample / 8;
    int out_nb_samples = 1024;
    int out_frame_size = out_nb_samples * out_channels * out_bytes_per_sample;

    // 添加输入输出流
    objAudioFilter.addAudioInput(1, samplerate, channels, bitsPerSample, AV_SAMPLE_FMT_S16);
    objAudioFilter.addAudioOutput(out_samplerate, out_channels, out_bitsPerSample, AV_SAMPLE_FMT_S16);

    // 设置自定义滤镜链（可根据实际需求修改）
    if (argc > 1)
    {
        objAudioFilter.setCustomFilter(argv[1]);
    }

    // 初始化滤镜
    if (objAudioFilter.init("longest") < 0)
    {
        printf("AudioFilter init failed\n");
        return -1;
    }

    // 打开输入输出文件
    FILE *file_in = fopen("8k.1.pcm", "rb");
    if (!file_in)
    {
        printf("fopen 8k.1.pcm failed\n");
        return -1;
    }
    FILE *file_out = fopen("output.pcm", "wb");
    if (!file_out)
    {
        printf("fopen output.pcm failed\n");
        fclose(file_in);
        return -1;
    }

    // 分配缓冲区
    uint8_t *in_buf = new uint8_t[pcm_frame_size];
    uint8_t *out_buf = new uint8_t[out_frame_size];
    uint32_t out_size = 0;
    int file_finish = 0;

    // 主循环：读取输入、送入滤镜、取出输出
    while (1)
    {
        int len = fread(in_buf, 1, pcm_frame_size, file_in);
        if (len > 0)
        {
            if (objAudioFilter.addFrame(1, in_buf, len) < 0)
            {
                printf("addFrame failed\n");
                break;
            }
        }
        else
        {
            // 输入结束，通知滤镜链
            if (file_finish == 0)
            {
                file_finish = 1;
                objAudioFilter.addFrame(1, NULL, 0);
            }
        }

        // 取出所有可用输出帧
        int ret = 0;
        while ((ret = objAudioFilter.getFrame(out_buf, out_frame_size)) > 0)
        {
            out_size += ret;
            fwrite(out_buf, 1, ret, file_out);
        }

        if (len <= 0)
        {
            printf("file finish\n");
            break;
        }
    }

    printf("end, total output size: %u bytes\n", out_size);

    // 资源释放
    objAudioFilter.exit();
    fclose(file_out);
    fclose(file_in);
    delete[] in_buf;
    delete[] out_buf;

    return 0;
}